<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>18 继承-原型继承</title>
</head>

<body>
  <script>
    function Parent() {
      this.x = 100;
    }
    Parent.prototype.getX = function getX() {
      return this.x;
    }

    function Child() {
      // 第二步，call继承，实现子类继承父类中的私有属性
      Parent.call(this);
      this.y = 200;
    }

    // 第一步，原型继承，实现子类继承父类的公共属性方法
    // 核心：让子类的原型对象的原型链指向父类原型对象

    // 写法1（不推荐使用了，效率低）
    // Child.prototype.__proto__ = Parent.prototype;
    // Child.prototype.constructor = Child;

    // 写法二（推荐）
    // 注意：创建一个新对象，原来的constructor丢失了，所以需要手动设置回来
    // Child.prototype = Object.create(Parent.prototype);
    // Child.prototype.constructor = Child;
    // 简写Child.prototype = Object.create(Parent.prototype, { constructor: { value: Child } });

    // 写法三（最推荐）
    Child.prototype = Object.setPrototypeOf(Child.prototype, Parent.prototype)

    Child.prototype.getY = function getY() {
      return this.y;
    }

    let c1 = new Child();

    console.log(c1) //=> 去控制查看原型链上的
    console.log(c1.x) //=> 100
    console.log(c1.getX()) // 100
  </script>
</body>

</html>